#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
TryExponent.com 网站镜像工具启动脚本

这个脚本提供了一个简单的命令行界面，用于运行网站镜像工具的各个功能。
"""

import os
import sys
import argparse
import logging
import subprocess

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("run.log"),
        logging.StreamHandler()
    ]
)

logger = logging.getLogger("RunScript")


def check_dependencies():
    """检查依赖是否已安装"""
    try:
        import bs4
        import requests
        import fake_useragent
        import tqdm
        import selenium
        return True
    except ImportError as e:
        logger.error(f"缺少依赖: {e}")
        logger.info("请先安装所需依赖: pip install -r requirements.txt")
        return False


def analyze_site(args):
    """分析网站规模"""
    cmd = [
        "python3", "site_analyzer.py",
        "-m", str(args.max_urls),
        "--delay", str(args.delay)
    ]

    if args.db:
        cmd.extend(["--db", args.db])

    logger.info(f"开始分析网站规模，最大URL数: {args.max_urls}")
    subprocess.run(cmd)


def crawl_site(args):
    """爬取网站内容"""
    # 增量爬取和续传爬取不能同时使用
    if hasattr(args, 'incremental') and hasattr(args, 'resume') and args.incremental and args.resume:
        logger.warning("增量爬取和续传爬取不能同时使用，将使用增量爬取模式")
        args.resume = False

    cmd = [
        "python3", "exponent_crawler.py",
        "-o", args.output,
        "-m", str(args.max_pages),
        "--delay", str(args.delay)
    ]

    if args.db:
        cmd.extend(["--db", args.db])

    if args.incremental:
        cmd.append("--incremental")

    if args.resume:
        cmd.append("--resume")

    # 添加浏览器重置间隔参数
    if hasattr(args, 'browser_reset'):
        cmd.extend(["--browser-reset", str(args.browser_reset)])

    mode = '增量' if args.incremental else '续传' if args.resume else '全新'
    logger.info(f"开始{mode}爬取网站内容，最大页面数: {args.max_pages}")
    subprocess.run(cmd)


def fix_paths(args):
    """修复HTML文件中的资源路径"""
    cmd = [
        "python3", "exponent_crawler.py",
        "-o", args.output,
        "--fix-paths"
    ]

    logger.info("开始修复HTML文件中的资源路径")
    subprocess.run(cmd)


def serve_site(args):
    """启动本地服务器"""
    cmd = [
        "python3", "exponent_crawler.py",
        "-o", args.output,
        "--serve",
        "--port", str(args.port)
    ]

    logger.info(f"启动本地服务器，端口: {args.port}")
    subprocess.run(cmd)


def check_status(args):
    """检查爬取状态"""
    cmd = [
        "python3", "exponent_crawler.py",
        "-o", args.output,
        "--status"
    ]

    if args.db:
        cmd.extend(["--db", args.db])

    logger.info("检查爬取状态...")
    subprocess.run(cmd)


def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='TryExponent.com 网站镜像工具')
    subparsers = parser.add_subparsers(dest='command', help='子命令')

    # 分析网站规模
    analyze_parser = subparsers.add_parser('analyze', help='分析网站规模')
    analyze_parser.add_argument('-m', '--max-urls', type=int, default=1000, help='最大分析URL数量')
    analyze_parser.add_argument('-d', '--delay', type=float, default=1.0, help='请求延迟（秒）')
    analyze_parser.add_argument('--db', help='数据库路径')

    # 爬取网站内容
    crawl_parser = subparsers.add_parser('crawl', help='爬取网站内容')
    crawl_parser.add_argument('-o', '--output', default='./output', help='输出目录')
    crawl_parser.add_argument('-m', '--max-pages', type=int, default=100, help='最大爬取页面数')
    crawl_parser.add_argument('-d', '--delay', type=float, default=1.0, help='请求延迟（秒）')
    crawl_parser.add_argument('--db', help='数据库路径')
    crawl_parser.add_argument('--incremental', action='store_true', help='使用增量爬取，只更新已修改的内容')
    crawl_parser.add_argument('--resume', action='store_true', help='使用续传爬取，只爬取未爬取过的内容')
    crawl_parser.add_argument('--browser-reset', type=int, default=100, help='每爬取多少页面后重置浏览器，防止内存泄漏')

    # 修复HTML文件中的资源路径
    fix_parser = subparsers.add_parser('fix', help='修复HTML文件中的资源路径')
    fix_parser.add_argument('-o', '--output', default='./output', help='输出目录')

    # 启动本地服务器
    serve_parser = subparsers.add_parser('serve', help='启动本地服务器')
    serve_parser.add_argument('-o', '--output', default='./output', help='输出目录')
    serve_parser.add_argument('-p', '--port', type=int, default=8000, help='服务器端口')

    # 检查爬取状态
    status_parser = subparsers.add_parser('status', help='检查爬取状态')
    status_parser.add_argument('-o', '--output', default='./output', help='输出目录')
    status_parser.add_argument('--db', help='数据库路径')

    # 一键完成所有步骤
    all_parser = subparsers.add_parser('all', help='一键完成所有步骤')
    all_parser.add_argument('-o', '--output', default='./output', help='输出目录')
    all_parser.add_argument('-m', '--max-pages', type=int, default=1000, help='最大爬取页面数')
    all_parser.add_argument('-d', '--delay', type=float, default=1.0, help='请求延迟（秒）')
    all_parser.add_argument('-p', '--port', type=int, default=8000, help='服务器端口')
    all_parser.add_argument('--db', help='数据库路径')
    all_parser.add_argument('--incremental', action='store_true', help='使用增量爬取，只更新已修改的内容')
    all_parser.add_argument('--resume', action='store_true', help='使用续传爬取，只爬取未爬取过的内容')
    all_parser.add_argument('--browser-reset', type=int, default=100, help='每爬取多少页面后重置浏览器，防止内存泄漏')

    args = parser.parse_args()

    # 检查依赖
    if not check_dependencies():
        return

    # 执行命令
    if args.command == 'analyze':
        analyze_site(args)
    elif args.command == 'crawl':
        crawl_site(args)
    elif args.command == 'fix':
        fix_paths(args)
    elif args.command == 'serve':
        serve_site(args)
    elif args.command == 'status':
        check_status(args)
    elif args.command == 'all':
        # 先分析网站规模
        analyze_args = argparse.Namespace(
            max_urls=args.max_pages,
            delay=args.delay,
            db=args.db
        )
        analyze_site(analyze_args)

        # 然后爬取网站内容
        crawl_args = argparse.Namespace(
            output=args.output,
            max_pages=args.max_pages,
            delay=args.delay,
            db=args.db,
            incremental=args.incremental,
            resume=args.resume,
            browser_reset=args.browser_reset
        )
        crawl_site(crawl_args)

        # 修复HTML文件中的资源路径
        fix_args = argparse.Namespace(
            output=args.output
        )
        fix_paths(fix_args)

        # 启动本地服务器
        serve_args = argparse.Namespace(
            output=args.output,
            port=args.port
        )
        serve_site(serve_args)
    else:
        parser.print_help()


if __name__ == "__main__":
    main()
